package com.ljk;

import com.ljk.util.reflect.ReflectUtil;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

public class Dom4jUtil implements Serializable {


    public static Document parseXML(String xmlString) {
        try {
            return DocumentHelper.parseText(xmlString);
        } catch (DocumentException e) {
            throw new RuntimeException("字符串转XML异常" + xmlString);
        }
    }

    /**
     * xml文档Document转对象
     *
     * @param document
     * @param clazz
     * @return
     */
    public static <T> T parse(Document document, Class<T> clazz) {
        try {
            //获取根节点
            Element root = document.getRootElement();
            T obj = clazz.newInstance();//创建对象
            for (Element pro : root.elements()) {
                ReflectUtil.invokeSetter(obj, pro.getName(), pro.getText());
            }
            return obj;
        } catch (InstantiationException e) {
            throw new RuntimeException("类初始化异常!", e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException("反射注入方法异常!", e);
        }
    }

    /**
     * xml字符串转对象
     *
     * @param xmlString
     * @param clazz
     * @return
     */
    public static <T> T parse(String xmlString, Class<T> clazz) {
        return parse(parseXML(xmlString), clazz);
    }

    /**
     * 对象转xml文件
     *
     * @param bean
     * @return
     */
    public static Document toXml(Object bean) {
        Document document = DocumentHelper.createDocument();
        try {
            // 创建根节点元素
            Element root = document.addElement(bean.getClass().getSimpleName());
            Field[] field = bean.getClass().getDeclaredFields(); // 获取实体类b的所有属性，返回Field数组
            for (Field value : field) { // 遍历所有有属性
                String name = value.getName(); // 获取属属性的名字
                if (name.equals("serialVersionUID")) {//去除串行化序列属性
                    continue;
                }
//                Type genericType = value.getGenericType();
//                genericType.
//                Class<?> type = ;
//                type.isArray();
//                type.isEnum();
//                type.isPrimitive();
//                type.isLocalClass();
//                type.isMemberClass();
//                type.isSynthetic();
//                type.isAnonymousClass();
                Element properties = root.addElement(name);
                properties.setText(ReflectUtil.invokeGetter(bean, name));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return document;
    }

    /**
     * 对象转xml格式的字符串
     *
     * @param b
     * @return
     */
    public static String format(Object b) {
        return toXml(b).asXML();
    }

    public static void main(String[] args) {

        BankData bank = new BankData("1233", "2017-06-13 10:24:31", "EEEEEE=", "000091", "0021");//创建一个任意实体对象
        Type genericSuperclass = bank.getClass().getGenericSuperclass();
        System.out.println("提前输出一下对象:" + bank);
        System.out.println("对象转xml\r\n" + format(bank));//调用方法把对象转xml格式
        System.out.println("*********************************************");
        System.out.println("xml转对象\r\n" + parse(format(bank), HashMap.class));//调用getXmlString（）方法把xml格式重新转换为对象
    }


}
